#include "../mqserver/message.hpp"
#include "../mqcommon/helpper.hpp"
#include <gtest/gtest.h>

mmq::MessageManager::ptr mmp;
mmq::MessageManager::ptr mmp1;

class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        mmp = std::make_shared<mmq::MessageManager>("./data/message/");
        mmp->InitQueueMessage("queue1");
    }
    virtual void TearDown() override
    {
        // mmp->Clear();
    }
};


// 新增消息测试，新增消息后观察可获取消息数量，以及持久化消息数量
TEST(message_test, insert_test)
{
    mmq::BasicProperties bp;
    bp.set_id(mmq::UuidHelper::uuid());
    bp.set_delivery_mode(mmq::DeliveryMode::DURABLE);
    bp.set_routing_key("news.music.pop");

    mmp->Insert("queue1", &bp, "Hello World-1", mmq::DeliveryMode::DURABLE);
    mmp->Insert("queue1", nullptr, "Hello World-2", mmq::DeliveryMode::DURABLE);
    mmp->Insert("queue1", nullptr, "Hello World-3", mmq::DeliveryMode::DURABLE);
    mmp->Insert("queue1", nullptr, "Hello World-4", mmq::DeliveryMode::DURABLE);
    mmp->Insert("queue1", nullptr, "Hello World-5", mmq::DeliveryMode::UNDURABLE);
    ASSERT_EQ(mmp->TotalCount("queue1"), 4);
    ASSERT_EQ(mmp->DurableCount("queue1"), 4);
    ASSERT_EQ(mmp->GetAbleCount("queue1"), 5);
    ASSERT_EQ(mmp->WaitAckCount("queue1"), 0);
}

// 获取消息测试：获取一条消息，然后在不进行确认的情况下可获取消息数量，待确认消息数量，以及测试消息获取的顺序
// TEST(message_test, select_test)
// {
//     mmq::MessagePtr msg1 = mmp->Front("queue1");
//     ASSERT_EQ(msg1->payload().body(), "Hello World-1");
//     ASSERT_EQ(mmp->GetAbleCount("queue1"), 4);
//     ASSERT_EQ(mmp->WaitAckCount("queue1"), 1);
//     mmq::MessagePtr msg2 = mmp->Front("queue1");
//     ASSERT_EQ(msg2->payload().body(), "Hello World-2");
//     ASSERT_EQ(mmp->GetAbleCount("queue1"), 3);
//     ASSERT_EQ(mmp->WaitAckCount("queue1"), 2);
//     mmq::MessagePtr msg3 = mmp->Front("queue1");
//     ASSERT_EQ(msg3->payload().body(), "Hello World-3");
//     ASSERT_EQ(mmp->GetAbleCount("queue1"), 2);
//     ASSERT_EQ(mmp->WaitAckCount("queue1"), 3);
//     mmq::MessagePtr msg4 = mmp->Front("queue1");
//     ASSERT_EQ(msg4->payload().body(), "Hello World-4");
//     ASSERT_EQ(mmp->GetAbleCount("queue1"), 1);
//     ASSERT_EQ(mmp->WaitAckCount("queue1"), 4);
//     mmq::MessagePtr msg5 = mmp->Front("queue1");
//     ASSERT_EQ(msg5->payload().body(), "Hello World-5");
//     ASSERT_EQ(mmp->GetAbleCount("queue1"), 0);
//     ASSERT_EQ(mmp->WaitAckCount("queue1"), 5);
//     mmq::MessagePtr msg6 = mmp->Front("queue1");
//     ASSERT_EQ(msg6.get(), nullptr);
// }

// 删除消息测试：确认一条消息，查看持久化消息数量，待确认消息数量
TEST(message_test, ack_test)
{
    ASSERT_EQ(mmp->GetAbleCount("queue1"), 5);
    mmq::MessagePtr msg1 = mmp->Front("queue1");
    ASSERT_EQ(msg1->payload().body(), "Hello World-1");
    ASSERT_EQ(mmp->GetAbleCount("queue1"), 4);
    ASSERT_EQ(mmp->WaitAckCount("queue1"), 1);
    mmp->Ack("queue1", msg1->payload().properties().id());
    ASSERT_EQ(mmp->WaitAckCount("queue1"), 0);
    ASSERT_EQ(mmp->DurableCount("queue1"), 3);
    ASSERT_EQ(mmp->TotalCount("queue1"), 4);
}

// 销毁测试
TEST(message_test, clear_test)
{
    mmp->DestroyQueueMessage("queue1");
}


// class MessageTest1 : public testing::Environment
// {
// public:
//     virtual void SetUp() override
//     {
//         mmp1 = std::make_shared<mmq::MessageManager>("./data/message/");
        
//     }
//     virtual void TearDown() override
//     {
//         // mmp->Clear();
//     }
// };

// // 恢复历史数据测试
// TEST(message_test1, recovery_test)
// {
//     mmp1->InitQueueMessage("queue1");
//     ASSERT_EQ(mmp1->GetAbleCount("queue1"), 3);
//     // mmq::MessagePtr msg1 = mmp1->Front("queue1");
//     // ASSERT_EQ(msg1->payload().body(), "Hello World-1");
//     // ASSERT_EQ(mmp1->GetAbleCount("queue1"), 3);
//     // ASSERT_EQ(mmp1->WaitAckCount("queue1"), 1);
//     // mmq::MessagePtr msg2 = mmp1->Front("queue1");
//     // ASSERT_EQ(msg2->payload().body(), "Hello World-2");
//     // ASSERT_EQ(mmp1->GetAbleCount("queue1"), 2);
//     // ASSERT_EQ(mmp1->WaitAckCount("queue1"), 2);
//     // mmq::MessagePtr msg3 = mmp1->Front("queue1");
//     // ASSERT_EQ(msg3->payload().body(), "Hello World-3");
//     // ASSERT_EQ(mmp1->GetAbleCount("queue1"), 1);
//     // ASSERT_EQ(mmp1->WaitAckCount("queue1"), 3);
//     // mmq::MessagePtr msg4 = mmp1->Front("queue1");
//     // ASSERT_EQ(msg4->payload().body(), "Hello World-4");
//     // ASSERT_EQ(mmp1->GetAbleCount("queue1"), 0);
//     // ASSERT_EQ(mmp1->WaitAckCount("queue1"), 4);
// }

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new MessageTest);
    // testing::AddGlobalTestEnvironment(new MessageTest1);
    int ret = RUN_ALL_TESTS();

    return 0;
}

